package com.cencat.driver.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.driver.entity.Vehicle;

import java.util.List;
import java.util.Map;

/**
 * 车辆服务接口
 * 
 * @author cencat
 * @since 2024-01-01
 */
public interface VehicleService extends IService<Vehicle> {

    /**
     * 根据车牌号查询车辆信息
     * 
     * @param plateNumber 车牌号
     * @param tenantId 租户ID
     * @return 车辆信息
     */
    Vehicle getByPlateNumber(String plateNumber, Long tenantId);

    /**
     * 根据司机ID查询车辆列表
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 车辆列表
     */
    List<Vehicle> getByDriverId(Long driverId, Long tenantId);

    /**
     * 根据车辆状态查询车辆列表
     * 
     * @param status 车辆状态
     * @param tenantId 租户ID
     * @return 车辆列表
     */
    List<Vehicle> getByStatus(Integer status, Long tenantId);

    /**
     * 根据车辆类型查询车辆列表
     * 
     * @param vehicleType 车辆类型
     * @param tenantId 租户ID
     * @return 车辆列表
     */
    List<Vehicle> getByVehicleType(Integer vehicleType, Long tenantId);

    /**
     * 查询可用车辆列表
     * 
     * @param tenantId 租户ID
     * @return 可用车辆列表
     */
    List<Vehicle> getAvailableVehicles(Long tenantId);

    /**
     * 分页查询车辆列表
     * 
     * @param current 当前页
     * @param size 每页大小
     * @param plateNumber 车牌号（模糊查询）
     * @param brand 品牌（模糊查询）
     * @param model 型号（模糊查询）
     * @param vehicleType 车辆类型
     * @param status 车辆状态
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 分页结果
     */
    IPage<Vehicle> getPageList(Long current, Long size, String plateNumber, String brand, String model,
                              Integer vehicleType, Integer status, Long driverId, Long tenantId);

    /**
     * 创建车辆
     * 
     * @param vehicle 车辆信息
     * @return 是否成功
     */
    boolean createVehicle(Vehicle vehicle);

    /**
     * 更新车辆信息
     * 
     * @param vehicle 车辆信息
     * @return 是否成功
     */
    boolean updateVehicle(Vehicle vehicle);

    /**
     * 删除车辆
     * 
     * @param id 车辆ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean deleteVehicle(Long id, Long tenantId);

    /**
     * 批量删除车辆
     * 
     * @param ids 车辆ID列表
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean batchDeleteVehicles(List<Long> ids, Long tenantId);

    /**
     * 更新车辆状态
     * 
     * @param id 车辆ID
     * @param status 车辆状态
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean updateStatus(Long id, Integer status, Long tenantId);

    /**
     * 批量更新车辆状态
     * 
     * @param ids 车辆ID列表
     * @param status 车辆状态
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean batchUpdateStatus(List<Long> ids, Integer status, Long tenantId);

    /**
     * 分配车辆给司机
     * 
     * @param id 车辆ID
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean assignToDriver(Long id, Long driverId, Long tenantId);

    /**
     * 取消车辆分配
     * 
     * @param id 车辆ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean unassignFromDriver(Long id, Long tenantId);

    /**
     * 根据司机ID取消所有车辆分配
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean unassignAllByDriverId(Long driverId, Long tenantId);

    /**
     * 批量分配车辆给司机
     * 
     * @param vehicleIds 车辆ID列表
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean batchAssignToDriver(List<Long> vehicleIds, Long driverId, Long tenantId);

    /**
     * 验证车牌号唯一性
     * 
     * @param plateNumber 车牌号
     * @param excludeId 排除的车辆ID（用于更新时检查）
     * @param tenantId 租户ID
     * @return 是否唯一
     */
    boolean validatePlateNumberUniqueness(String plateNumber, Long excludeId, Long tenantId);

    /**
     * 更新车辆里程数
     * 
     * @param id 车辆ID
     * @param mileage 里程数
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean updateMileage(Long id, Double mileage, Long tenantId);

    /**
     * 更新车辆保险到期时间
     * 
     * @param id 车辆ID
     * @param insuranceExpiry 保险到期时间
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean updateInsuranceExpiry(Long id, String insuranceExpiry, Long tenantId);

    /**
     * 查询保险即将到期的车辆
     * 
     * @param tenantId 租户ID
     * @return 车辆列表
     */
    List<Vehicle> getInsuranceExpiringSoon(Long tenantId);

    /**
     * 查询保险已过期的车辆
     * 
     * @param tenantId 租户ID
     * @return 车辆列表
     */
    List<Vehicle> getInsuranceExpired(Long tenantId);

    /**
     * 获取车辆统计信息
     * 
     * @param tenantId 租户ID
     * @return 统计信息
     */
    Map<String, Object> getStatistics(Long tenantId);

    /**
     * 获取司机车辆统计信息
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 统计信息
     */
    Map<String, Object> getDriverVehicleStatistics(Long driverId, Long tenantId);

    /**
     * 导出车辆信息
     * 
     * @param plateNumber 车牌号（模糊查询）
     * @param brand 品牌（模糊查询）
     * @param model 型号（模糊查询）
     * @param vehicleType 车辆类型
     * @param status 车辆状态
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 导出数据
     */
    List<Map<String, Object>> exportVehicles(String plateNumber, String brand, String model,
                                            Integer vehicleType, Integer status, Long driverId, Long tenantId);

    /**
     * 导入车辆信息
     * 
     * @param vehicleList 车辆信息列表
     * @param tenantId 租户ID
     * @return 导入结果
     */
    Map<String, Object> importVehicles(List<Map<String, Object>> vehicleList, Long tenantId);

    /**
     * 车辆年检提醒
     * 
     * @param tenantId 租户ID
     * @return 需要年检的车辆列表
     */
    List<Vehicle> getAnnualInspectionReminder(Long tenantId);

    /**
     * 车辆保养提醒
     * 
     * @param tenantId 租户ID
     * @return 需要保养的车辆列表
     */
    List<Vehicle> getMaintenanceReminder(Long tenantId);

    /**
     * 根据载重量查询车辆
     * 
     * @param minLoadCapacity 最小载重量
     * @param maxLoadCapacity 最大载重量
     * @param tenantId 租户ID
     * @return 车辆列表
     */
    List<Vehicle> getByLoadCapacityRange(Double minLoadCapacity, Double maxLoadCapacity, Long tenantId);

    /**
     * 根据车辆年份查询车辆
     * 
     * @param startYear 开始年份
     * @param endYear 结束年份
     * @param tenantId 租户ID
     * @return 车辆列表
     */
    List<Vehicle> getByYearRange(Integer startYear, Integer endYear, Long tenantId);

    /**
     * 获取车辆使用率统计
     * 
     * @param tenantId 租户ID
     * @return 使用率统计
     */
    Map<String, Object> getUtilizationStatistics(Long tenantId);

    /**
     * 获取车辆成本统计
     * 
     * @param tenantId 租户ID
     * @return 成本统计
     */
    Map<String, Object> getCostStatistics(Long tenantId);

    /**
     * 车辆健康检查
     * 
     * @param id 车辆ID
     * @param tenantId 租户ID
     * @return 健康检查结果
     */
    Map<String, Object> healthCheck(Long id, Long tenantId);

    /**
     * 批量车辆健康检查
     * 
     * @param tenantId 租户ID
     * @return 健康检查结果列表
     */
    List<Map<String, Object>> batchHealthCheck(Long tenantId);
}